TL/1−MSX TL−X ――――――――――――――――――――――――――――――――――――――― アスキー 1984年 7月号掲載 MSX マシン語 0CE00H−0F1BFH S:0CE00H 起動方法 ディスクを切り離して(SHIFTキーを押しながら起動) CLEAR 100,&HCDFF BLOAD”CAS:”,R ――――――――――――――――――――――――――――――――――――――― TL/1が産声を上げてから4年の月日が通過しました。 この間に、H68TRワンボードマイクロコンピュータを始めとして、 PC−8001、Apple IIなど、多くの機種に移植され GAMEに続くアスキーの標準言語の一つとなっています。 そして、今ここにMSXマシンの機能を最大限に活用するための TL/1−MSXの第1回をお届けします。 今回は、TL/1−MSXの全リスト、リファレンス、 簡単な操作法等について解説をします。 第2回(来月予定)では、内部の詳細な説明、 MSXのROMOS等についてを予定しています ■■■■■■■■■■■■■■■■■■■         概要 ■■■■■■■■■■■■■■■■■■■ TL/1−MSX(以下TL/Xと呼ぶ)のオリジナルはTL/1−PCです。 MSXマシンの場合は、機械語モニタを持たないため、 TL/Xでは、6月号で紹介したエディタ・アセンブラ用のモニタに 一部改良を加えて使用しています。 エディタにも改良を加え専用としてあります。 従来のTL/1では、BASICのエディタで ソースプログラムを作成していましたが、 TL/Xでは、MSXのメモリ容量の関係で 専用のものを用意しました。 これにより、ソースプログラム作成から、 コンパイイルまでの操作手順が短縮され、 モニタ、コンパイラ本体、エディタが一つにパックされた 『TL/1システム』が構築されます。 言語仕様自体は既存のTL/1と 完全にコンパチビリティーを保ちつつ、 MSXマシンの機能を活かすための拡張がされています。 特にグラフィック関係は、 MSX−BASICのDRAW文以外の 殆ど全ての命令をサポートしています。 また、サウンド関係も、BASICのPLAY文に相当する 簡単なBGM機能を持っています。 しかし、何といっても最大の特徴は、 専用エディタを採用したことにより、 『インタープリタ感覚』で使えるようになったことです。 つまり、コンパイル中にエラーが発生すると、 自動的にエディタが起動され、エラーが発生した個所を表示し、 エディット状態になります。 このシステムは、当然RAM16Kbyteの MSXマシンでも十分使えるように設計されています。 ただし、16Kbyteマシンではソースプログラムエリアが少ないので、 1度に大きなプログラムをエディットすることができません。 そのため、ソースプログラムを幾つかに分割して入力し、 これをカセットテープ上でリンクして、 カセットを読み込みながらコンパイルする機能を用意しました。 これにより、16Kbyteマシンでも、 ランタイムルーチンを含まない純粋なオブジェクトにして 約 5.5Kbyteまでのプログラムをコンパイルすることができます。 ということは、32Kbyteマシンでは 何と21Kbyte以上のオブジェクト生成が可能になるわけです。 以上のように、TL/Xは機能的には 現時点での『最強のTL/1』ということができるでしょう。 コンパイルしかオブジェクトの実行速度については 残念ながら最速とは言えませんが、 オリジナルとなったTL/1−PCやTL/1−Apple以上の 実行速度は実現しています。 ただし、TL/1−PCより速いのは、 単に実質的なクロック周波数の違いによるものです (CPUは同じZ80Aで、4MHzのPCが  約 3.5MHzのMSXより遅いのは変だ、と思われるでしょう。  実際にはハードウェアの設計法の違いにより、  このようなことが起こり得るのです)。 ■■■■■■■■■■■■■■■■■■■       起動するまで ■■■■■■■■■■■■■■■■■■■ ダンプリストから手で入力される方は、 本誌84年1月号P. 277に掲載された 「BASIC簡易モニタ」を利用すればよいでしょう。 この場合はモニタプログラムの先頭に以下のリストを追加してから 実行して下さい。 ・―――――――――――――――――・ |10 CLEAR 100,&HCDFF        | ・―――――――――――――――――・ 月刊テープアスキーから起動する場合は、 最初にローダープログラムをロード・実行し、 ローダープログラムの指示に従ってTL/X本体をロードします。 この場合のファイル名は“LOADER”です。 ローダープログラムはC800H番地からスタートするので、 ローダープログラムを実行する前に ・―――――――――――――――――・ |CLEAR 100,&HC7FF         | ・―――――――――――――――――・ をダイレクトコマンドで必ず実行して下さい。 MSX-Editor Assembler plusの記事でも使用した この2段階のロード方法は、チエックサムによるロードを行うためで、 この方法により、ロード時のロードミスを発見することができ、 実行したら暴走してしまった、という危険を回避できます。 いずれの場合も、メモリにプログラムが入力されたら、 以下の方法で、このプログラムのバックアップを作成します。 ・―――――――――――――――――・ |BSAVE"CAS:TL/X",&HCE00,&HF1BF   | ・―――――――――――――――――・ スタート番地はCE00Hです。 ・―――――――――――――――――・ |DEFUSR=&HCE00           | |X=USR(0)             | ・―――――――――――――――――・ とすることにより、エディタが起動します。 また、バックアップテープからTL/Xをロード・実行する場合は ・―――――――――――――――――・ |CLEAR 100,&HCDFF         | |BLOAD"CAS:TL/X",R         | ・―――――――――――――――――・ とします。 ■■■■■■■■■■■■■■■■■■■     エディタ ■■■■■■■■■■■■■■■■■■■ エディタには、MSX-Editor Assembler plusのエディタと ほぼ同じものを使用しています。 殆どのコマンドが共通なので、 ここでは、変更されたコマンド、 追加されたコマンドについてのみ解説します。 共通のコマンドについては本誌6月号 MSX-Editor Assembler plus記事中の エディタの解説を参照して下さい。 表1にエディタの全コマンドを示します。 このエディタはポインタ形式を採用しており、 ポインタは行単位で移動することができます。 画面最下行に現れるエディタのプロンプト“>”のすぐ上の行に 表示されているテキストがあれば、 それがポインタの指している行ということになります。 場合は、“N”コマンドを使用することにより、 現在ポインタの指している行を表示させることができます。 これらの場合、テキストの代わりに“^”マークが表示されたら、 ポインタがテキストの底にある、 即ちポインタの後ろには何もテキストが無いことを示しています。 ポインタの移動は表1に上げたコマンド以外に、 [RETURN]、[BS]キーを使用することにより リストのアップ・ダウンスクロールを行うことができます。 エディタプロンプトに続けて[RETURN]キーのみを入力すると、 ポインタは1行下がり、 同時に新しくポインタが指した行を表示します。 [BS]キーはこれと逆の処理で、 ポインタを1行上げ1行表示します。 これらのキーをうまく使うと、 ポインタを目的の行に素早く移動することがてきます。 このポインタを基準に、テキストを挿入−削除あるいは修正するわけです。 エディタのプロンプトが出ている「コマンド・モード」から “I”または“B”コマンドによって「インサート・モード」に入り、 テキストの連続挿入ができます。 この時、[TAB]キーはちょっと変わった働きをします。 TL/1もそうですが、アルゴル系の言語では テキストのインデント(段付け)を多用します。 この時始めは、普通にスペースキーにより、 必要な数だけスペースを入力しインデントをしますが、 次の行からは[TAB]キーを入力することにより、 上の行と同じだけのスベースをテキストに挿入することができます。 インデントの量を変えるときは、スペースキーまたは[BS]キーで調整します。 このインデント量は、テキストを行の先頭から書いた場合にもクリアされず、 最後にインデントを付けた時の量を記憶しています。 ここで気になるのが、インデントを付けたことにより、 スベースの分だけメモリを消費してしまうのではないか、 という心配です。 BASICなどでは、リスト中のスペースも1キャラクタとして判断されるので、 スペースの数に比例してメモリも消費されますが、 このエディタではメモリ消費を心配する必要はありません。 [TAB]キーによるインデントのスベースは、 インデント量をコード化しているため、 2バイト以上メモリを消費しません。 もちろん行の先頭からスペース以外の文字が入る場合は、 テキストがそのまま記憶されます。 インサートモードでは、 カーソルキーや[INS]、[DEL]キーなどの修正キーは使えません。 誤った入力は[BS]キーで消去してから再入力して下さい。 また、インサートモードを抜けるには[RETURN]キーのみを入力します。 なお、行番号はエディタが自動的に付けるので入力する必要はありません。 1行をスクリーンエディットするには、 “E”コマンドまたは[↑]キーを使用して、 「エディットモード」に入ります。 エディットモードに入ると、 エディットしようとする行が行番号無しでスクリーンに表示され、 カーソルが行の先頭に現れます。 このモードではBASICのテキストをエディットするのと同様に MSXの全ての修正キーが使えます。 通常は、[RETURN]の入力により、エディットモードを抜けますが、 この時、[↑]キーを使用してエディットモードに入った場合のみ ポインタが1行下がります。 ここで再び[↑]キーを押せばその行をエディットできるので [↑]キーは連続して行をエディットするときに便利な機能です。 アセンブラのエディタのコマンドとは 機能が少し異なるコマンドについて説明します。 まずポインタの移動およびリスト表示コマンドのうち “V”、“P”、“U”コマンドにおいて 上下するポインタの行数は、アセンブラ用エディタでは21行でしたが、 TL/X用エディタでは10行となっています。 これはTL/Xの場合、プログラムとしては1行でも画面上では、 複数行にわたるテキストが多いので、21行表示したのでは、 1画面に入りきらないことが多いためです。 アセンブラのエディタでは、 “F”コマンドは特定の文字列で始まる行を探すものでしたが、 TL/Xのエディタでは行の途中の文字列を探すことが可能になっています。 TL/1のようなソーステキストでは、 このようにしないとコマンドの持つ意味が無くなってしまいます。 表1 TL/1−MSXエディタコマンド ・―――――――――――――――――――――――――――――――――――――・ |:コマンド:|:一般型:|意::::::味|::::例::::::|::::::機::::::::::能::::::| |―――――+――――+―――――+――――――+―――――――――――――| |     |I |Insert |I |(PT)の上にテキストを連続挿入 | |入力   |In |Insert n |I32 |n行の上にテキストを連続挿入 | |     |B |Bottom |B |PTを底にしてテキストを連続挿入| |―――――+――――+―――――+――――――+―――――――――――――| |   |Dn |Delete |D5 |(PT)からn行削除     | |削除   |D,n |Delete n |D,7 |n行目からPTの上までを削除| |     |K. |Kill |K. |全テキストを削除       | |―――――+――――+―――――+――――――+―――――――――――――| |     |T |Top |T |PTを0行にする      | |  |Tn |Top n |T23 |PTをn行にする      | |     |Bn |Bottom |B4 |PTを底からn行目にする  | |ポインタ移動 |U |Up |U |PTを10行上げる      | |     | ̄ | | | | |     |un |Up n |U34 |PTをn行上げる      | |     |Nn   |Next |N5 |PTをn行下げる      | |―――――+――――+―――――+――――――+―――――――――――――| |     |P |Print |P |PTを10行下げながら10行表示| |     | ̄ | | | | |     |Pn |Print n |P10 |PTをn行下げながらn行表示| |     |V |View |V |PTを10行上げ10行表示   | |     | ̄ | | | | |リスト表示 |A |An |A |全テキストを表示       | |     |N | |N |(PT)を表示        | |     |Q | |Q |行番号なしに(PT)以後を表示| |     |QP | |QP |行番号なしに(PT)以後を印字| |―――――+――――+―――――+――――――+―――――――――――――| |     |E |Edit |E |(PT)をスクリーンエディット     | |     |En |Edit n |E52 |n行目をスクリーンエディット    | |修正   |Rs |Retype |Rvar i |(PT)を に置換      | |     |Xds1ds2 |exchange |X $i $j |(PT)のs1をs2に置換    | |―――――+――――+―――――+――――――+―――――――――――――| |     |Fs |Find |Floop |PTの次からsを含む行を探す | |検索置換 |Ms |Match |Mcpl |PTの次からsを含む行を | |     | | | | 全て表示| |     |Ydslds | |Y$i$j |PT以下全行のs1をs2に置換 | |―――――+――――+―――――+――――――+―――――――――――――| |移動   |Wn1,n2 |Warp |W20,36 |n1〜n2行を(PT)の上に移動 | |―――――+――――+―――――+――――――+―――――――――――――| |     |Ss |Save |Stext |全テキストをファイルsでセーブ | |     |Ls |Load |Lmsx |(PT)の上にファイルsをロード | |     |Z |     |Z |テキストを255文字ずつ | |     | ̄ | | | アスキーセーブする| |入出力  |ZZ | | |テキストを255文字ずつ | |     | ̄ | | | アスキーセーブする(エンドマーク付き)| |―――――+――――+―――――+――――――+―――――――――――――| |     |O |go to Os |O |MSXモニタをコール | |     |Gx |Go |Gb000 |X番地をコール | |特殊   |PS |Print  |PS |残り領域と使用領域を表示 | |     | | Status| | | |     |H |Hard Copy |H |プリンタ出力のON/OFF | |―――――+――――+―――――+――――――+―――――――――――――| |     |C |Compile |C |オブジェクトを作成しない | |     | ̄ | | | 空コンパイルを行う| |     |CO |Compile |CO |コンパイルを行いオブジェクトを | |     | ̄ | to Object| | 作成する| |     |CT |Compile | |Zコマンドでセーブされたテキストを | |     | ̄ | From | |カセットから読みながらコンパイルを| | | | Cassette| |行う | | | | Tape| | | ・―――――――――――――――――――――――――――――――――――――・ ※_で示された命令は、拡張または変更された命令を示す。 ※nは10進数、xは16進数、sは文字列、dはデリミタでsに含まれない任意の文字。 ※n、xに不適当な文字列を含むと、その前の文字までが有効となる。 ※PTはポインタ、(PT)はポインタの示す行を表す。 ■■■■■■■■■■■■■■■■■■■      コンパイラの起動 ■■■■■■■■■■■■■■■■■■■ エディタの“C”、“CO”、“CT”コマンドにより、 コンパイラが起動します。 “C”コマンドは「空コンパイル」を行うもので、 オブジェクトをメモリに作成しません。 メモリ中にコンパイルしたオブジェクトを作成する場合は “CO”コマンドを使用します。 何れの場合も、コンパイル終了時には、 ソーステキストエリア及び オブジェクトプログラムエリアの表示が行われます。 ここでのオブジェクトエリアというのはランタイムルーチンを含まない、 ソーステキストがコンパイルされたオブジェクトです。 16KRAMのMSXマシンや大きなソーステキストをコンパイルする際は、 まず空コンパイルを行いオブジェクトエリアとソースエリアが 重ならないことを確認すれば、 大切なソーステキストを壊してしまうことはありません。 ソースプログラムがメモリに入りきらないような場合には、 ソースをメモリに入る分づつに区切ってテープにセーブし、 後でまとめてテープを読み込みながらコンパイルすることができます。 この場合、1回分のテキストをテープにセーブするのに “Z”コマンドを使用します。 ただし、コンパイラにプログラムの終わりを知らせてやる必要があるので、 プログラムの最後のテキストをセーブする場合のみ “ZZ”コマンドを使用します。 これにより、テキストにエンドマークが自動的に挿入され、 このテープの読み込みが終了するとコンパイルも終了します。 それぞれのテキストは1本のテープに、 プログラムの順番通りに続けてセーブします。 このようにして、テープにセーブされたプログラムをコンパイルするには、 “CT”コマンドを使用します。 テープの再生準備をしてからコンパイラを起動して下さい。 “Z”、“ZZ”コマンドでセーブしたテープはコンパイラ専用で、 エディタでは読み込むことができません。 作成したソースプログラムを保存する場合は、 必ず“S”コマンドでファイルネーム付きのセーブをして下さい。 コンパイル終了時には、“C”コマンドでコンパイラを起動したときのみ、 エディタに戻りますが、 他の場合はモニタに飛びます。 特に“CT”コマンドを使用した場合は エディタのプログラムが壊されているのが普通なので、 モニタからエディタに戻ることは避けて下さい。 ■■■■■■■■■■■■■■■■■■■        モニタ ■■■■■■■■■■■■■■■■■■■ モニタはエディタの“O”コマンドを使用したときや、 オブジェクトをメモリに生成しながらコンパイルした後に起動されます。 コマンドは、アセンブラに付属のモニタと殆ど同じなので、 ここでは新しく追加されたコマンドについてのみ説明をします。 新設コマンド以外については、アセンブラのコマンド解説を参照して下さい。 なお、コマンドの一覧を表2にまとめておきました。 モニタからエディタに戻るのに、 アセンブラでは“B”コマンドを用いましたが、 TL/Xのモニタでは“T”コマンドを用います。 これは、名前が変わったばかりでなく機能も異なっています。 “B”コマンドはモニタをコールしたプログラムに戻るものだったのに対し、 “T”コマンドはテキストエディタにジャンプします。 これは、コンパイル時にエラーを起こして モニタに飛んだ場合に再度コンパイラに戻ってもしかたがないからです。 コンパイルしたオブジェクトは、 モニタの“O”コマンドで即実行することができます。 このコマンドはコンパイルした後、 エディタに戻ったりしてオブジェクトプログラムを壊さない限り、 何度でも使用できます。 ソーステキストに戻るとオブジェクトが壊れるのは、 ソーステキストエリアとオブジェクトエリアが 同じ領域を使っているためです。 “O”コマンドでは、 オブジェクトが壊されたかどうかの簡単なチェックを行い、 壊された場合には何もしません。 TL/Xでは、実際のオブジェクトは ランタイムルーチン(E700H〜EC0BH)とは離れた位置に作成されます。 このような構造とすることにより、 異なったメモリシステム(16/32Kbyte)に 容易に対応できる等の利点が生まれるのですが、 コンパイルしかオブジェクトのみを単独に利用した場合などは、 テープのロード/セーブがやっかいになります。 そこで、この点を解消するために、“B”コマンドを用意しました。 使い方はファイルこそ指定して、例えば次のようにします。 ・―――――――――――――――――・ |*BOBJ            | ・―――――――――――――――――・ これにより、純粋なオブジェクトとランタイムルーチン、 それにオブジェクトを転送して起動する プログラムの3つがひとまとめになって “OBJ”というファイルネームでセーブされます。 こうして出来上がったプログラムは ・―――――――――――――――――・ |BLOAD”CAS:OBJ”,R | ・―――――――――――――――――・ とすることにより、ロードして自動的に実行することができます。 その他の注意点としては、 テープのロード/セーブ中に[CTRL]-[STOP]キーを押すと BASICに戻ってしまう場合があります。 そんな時には[F5]キーを押すことにより、 エディタに、[F10]キーによリモニタに復帰することができます。 これは、どのようにしてBASICに戻った場合にも使えます。 ただし、BASICに戻ったとき、エラーとなるようなことをすると、 まれに暴走することがあるので注意して下さい。 表2 モニタコマンド ・―――――――――――――――――――――――――――――――――――――・ |::::一::般::型::::|::意::昧::|::::例::::|::::::::機::::::::::能::::::::| |―――――――――+―――――+―――――+―――――――――――――――| |C〔st〔,en〕〕 |Check-sum |CB000,BFFF|stからenのアドレスのチェックサム付き | | | | |    ダンプ| |D〔st〔,en〕〕 |Dump |D100 |stからenのアドレスのアスキーキャラクタ付き| | | | |     ダンプ| |―――――――――+―――――+―――――+―――――――――――――――| |Esl,ad |Enable |E20,4000 |slでスロット、adでアドレスを指定して、| | | | |そのスロットをアクセス可能とする。 | | | | |slは2桁の16進数で、上位で | | | | |プライマリ、下位でセコンダリスロットを | | | | |指定する | |―――――――――+―――――+―――――+―――――――――――――――| |Fst,eb,de |Fill |F9000,91FF|stからenのアドレスのメモリを | | | |   ,12 |データdtで埋める | |Mst,en,de |Move |M0,1FFF |stからenのアドレスにあるデータを | | | | ,A000|deのアドレスに転送 | |―――――――――+―――――+―――――+―――――――――――――――| |S〔st〕 |Set |DB000 |stのアドレスからメモリ内容を変更 | | | | |する。[RETURN]のみの入力で | | | | |アドレスが1つ進み[BS]で1つ戻る。 | | | | |終了には"."を入力 | |―――――――――+―――――+―――――+―――――――――――――――| |T |Text |T |エディタを起動する | | ̄ | editor|     | | |Gad |Go |GC800 |adのアドレスをコールする | |O |Object |O |コンパイルしたオブジェクトを実行する | | ̄ | | |      | |―――――――――+―――――+―――――+―――――――――――――――| |Rfn〔,R〔,of〕〕 |Read |Robj,r |BASICのBLOAD"CAS:"コマンドと同じ | |Wfn,st,en〔,rn〕|Write |Wbas,0 |BASICのBSAVE"CAS:"コマンドと同じ | | | | ,7fff,0| | |Bfilename |Bsave |Bmsx |オブジェクトをランタイムルーチンと共に | | ̄ ̄ ̄ ̄ ̄ | | |テープにセーブする | |―――――――――+―――――+―――――+―――――――――――――――| |^P |Printer |^P |プリンタに対する出力をON/OFFする | ・―――――――――――――――――――――――――――――――――――――・ ※オブジェクトは独立でセーブしても、実行することが可能である。 ただしこの場合は、開始番地はランタイム先頭ではなく、  常に生成したオブジェクトの先頭アドレスとなる。 ※TL/1のオブジェクト実行終了後はBASICに戻る。  エディタに移るには[F5]、モニタに移るには[F10]キ  ーを押す。 ※パラメータは全て16進数で与える。またファイル名は6文字以内とする。 ※出力の一時停止は[STOP]キー、中止は[CTRL]-[STOP]で行う。 ※〔 〕内のパラメータは省略可能。 ■■■■■■■■■■■■■■■■■■■       コンパイラ ■■■■■■■■■■■■■■■■■■■ コンパイラの基本的な言語仕様は TL/1−PCと完全なコンパチビリティーを持ってます。 これに関しては付属の『TL/1リファレンスマニュアル』を 参考にして下さい。 コンパイル中に表示するエラーは、 オブジェクトの実行時に表示されるものを含めて 表3にまとめであります。 コンパイル時の文法エラーは、 PC版では単に「ERROR」としか表示されませんでしたが、 TL/Xではこれを2通りに分類しました。 宣言されていない単語が発見された場合に表示される「Undeclared」と それ以外の場合に表示される「Error Syntax」です。 しかし、この分類はまだ不完全で、 不適当なメッセージが表示される場合もあります。 ただし、TL/Xでは コンパイとエディタが共存している利点を最大に生かして、 エラーの発生と同時にエディタが起動されます。 この時、まずエラーの発見された行が 行番号付きで表示されます。 次にその行番号無しで表示されて、 そのまま「エディタ・モード」に入ります。 さらにカーソルは、コンパイラがエラーを発見して コンパイルを打ち切った最後の文字の上に現れます。 これにより、殆どの場合どこにエラーがあるかを 発見することができます。 また、簡単にエラーを修正することも可能です。 しかし、ここで「殆どの場合」と言ったのは、 エラーの発見された行に必ずしもエラーがあるとは限らないからです。 エラーの「種」はもっと上の方でまかれたのかもしれないということです。 この「エラー→エディット機能」が働くのは、 “C”または“CO”コマンドで コンパイラを起動したときのみです。 “CT”コマンドの場合は、 エラーを発見するとモニタにとんでしまいます。 理由は、書くまでもないことですが、 “CT”コマンド使用時にはメモリ中にソースプログラムが有りませんし、 場合によってはもうエディタも無くなっているかもしれないからです。 コンパイルしたオブジェクトの実行終了時には、BASICに飛びます。 このときBASICのブレークルーチンを使っていますので、 「Break」と表示されます。 ここでBASICが登場するのは不似合いな気もしますが。 オブジェクトを単独で実行する場合を考えると、 モニタヘ飛ばすわけにもいかず、このようにしました。 BASICからエディタまたはモニタヘ戻るには 前述のように[F1]/[F10]キーを使用して下さい。 表3 TL/Xエラーメッセージ ・―――――――――――――――――――――――――――・ |::::メッセージ::::::|::::::::::意::::::::味::::::::::| |――――――――――+――――――――――――――――| |Error Sysntex   |構文エラー           | |Undeclares    |未定義の単語を使った      | |Too Many Identifiers|手続き、関数の数が多すぎる   | |Too Many Variables |変数、配列の数が多すぎる    | |Object Too Long |オブジェクトプログラムが長すぎる| |Division by 0 |0で割ろうとした        | ・―――――――――――――――――――――――――――・ ■■■■■■■■■■■■■■■■■■■      標準ライブラリ機能 ■■■■■■■■■■■■■■■■■■■ TL/Xのもう一つの特徴は、ライブラリ機能の豊富さにあります。 ライブラリとして組み込まれている手続き、関数を表4に示します。 ほとんどのものはMSX−BASICと パラメータ順を同じにしてあるので説明は省略します。 ただし、グラフィック座標の指定に“STEP”は使えません。 また、エラーチェックを省いているものが多いので、 不適当なパラメータを与えると異常動作をする可能性があります。 注意して下さい。 ここでは、BASICとパラメータの与え方の異なるもの およびBASICでサートしていないものについてのみ解説します。 手続き“CIRCLE”のパラメータは 順にX座標、Y座標、半径、カラー、アスペクト比です。 アスペクト比はBASICと異なり、0〜 255の値をとります。 CRTによっても異なりますが、 140程度で真円に見えます。 手続き“LINE”の6番目のパラメータは0、1、2のいずれかの値をとり、 0を指定した場合は普通の直線、1はボックス、2はボックスフィルとなります。 つまり、BASICの“B”、“BF”に対応します。 手続き“PUTSPRITE” の4番目のパラメータはカラーですが、 この値のbit7を立てることにより、 スプライトの表示位置を左に1スプライト分だけシフトすることができます。 具体的には、0〜15のカラーコードの代わりに128〜143を使います。 これは、X座標の指定に負数を使用できないので、 スプライトに画面の左側に消えていくような働きをさせるための機能です。 手続き“PAINT” の4番目のパラメータは、 マルチカラーモードのときのみ有効で、 ハイレゾリューションモードでは意味を持たないので省略しても構いません。 手続き“SCREEN”のパラメータは3つだけです。 「カセットボーレイト」と「プリンタオプション」の指定は、 必要ならばTL/Xを起動する以前にBASICで行って下さい。 手続き“SPRITE”はBASICの 「SPRITE$(N)=文字列」 という文に対応するもので、 Nはスプライト番号を示し、それ以後のパラメータでデータを与えます。 データ数はスプライトサイズにより8または16個です。 手続き“VPOKE” および関数“VPEEK” で指定するアドレスは、 上位、下位の順に2個のパラメータを使って指定します。 手続き“KEY” は、ファンクションキーの表示をON/OFFするもので、 N=0で表示を消し、0以外で表示します。 関数“TIME”は、パラメータを取らないので、 特殊変数とも言えるものですが、 MSXの時計カウンタの下位1byteを返します。 関数“KEYPORT” は図2に示した キーマトリクスの行(0〜8)を指定することにより、 その行に配列されたキーボードの状態を返すもので、 押されているキーは0、押されていないものは1の値を持ちます。 例えば“R”と“L”のキーを押しているときに、 ・―――――――――――――――――・ |I:=KETYPORT(4)          | ・―――――――――――――――――・ を実行すれば、Iには“01111101” すなわち 125が代入されます。 関数“ROMOS” は手続さとして使用しても構いませんが、 AH、ALで指定されるアドレスをコールして ACCの値を持ち帰るものです。 表に示したパラメータによって、フラグレジスタと裏レジスタを除く 全てのレジスタに値を引き渡すことが可能です。 この関数に限らず、全てのライブラリ手続き、関数において、 パラメータは必要なところまで指定すればよく、 それ以後は省略しても構いません。 ただし、その場合にはどんな値が渡されるか全く保障できません。 また途中のパラメータを省略することはできません。 ライブラリ機能ではありませんが、出力装置として拡張されたものがあります。 0、1番はTL/1の標準出力装置であるCRTとプリンタですが、 2番にグラフィック画面への文字出力を割り当ててあります。 これはBASICの ・――――――――――――――――――――――――――・ |OPEN"GRP:"FOR OUTPUT AS#1              | |PRINT #1,文字列                   | ・――――――――――――――――――――――――――・ によって実現される機能に対応したものです。 さらに3番目にはBASICの「PLAY」文に 相当する機能を持たせてあります。 ・――――――――――――――――――――――――――・ |WRITE(3:"マクロ1,マクロ2,マクロ3")              | ・――――――――――――――――――――――――――・ というTL/Xの表現は、BASICの ・――――――――――――――――――――――――――・ |PLAY"マクロ1","マクロ2","マクロ3"              | ・――――――――――――――――――――――――――・ に対応します。 ただし、マクロ言語中には変数の使用はできません。 また、BASICのように文字列を3つの書くのではなく、 1つの文字列を“,”で3つに区切ることに注意して下さい。 3声同時に発生させるのでなければ「マクロ2」以降は省略しても構いません。 次のように書くことができます。 ・――――――――――――――――――――――――――・ |WRITE(3:"マクロ1,マクロ2")                | |WRITE(3:"マクロ1")                   | ・――――――――――――――――――――――――――・ ここで、TL/Xの入出力装置を表5にまとめておきます。 入出力装置の1番目以降、出力装置の4番目以降は未定義です。 表4 TL/Xライブラリ機構 ・―――――――――――――――――――――――――――――――――――――・ |::::手::::続::::き::::|::::::::::::パ::ラ::メ::ー::タ::解::説::::::::::::| |―――――――――――+―――――――――――――――――――――――――| |Circle(x,y,r,c,a) |x,y:円の中心 r:円の半径 c:カラー a:アスペクト比(真円は | | | 140程度)| |Color(f,k,b)     |f:ファオグランド k:バックグランド b:ボーダー | |Line(x1,y1,x2,y2,c,b) |x1,y1:始点座標 x2,y2:終点座標 c:カラー b:オプション(0: | | |   ライン 1:ボックス 2:ボックスフィル)| |Locate(x,y,c) |x,y:座標 c:カーソルスイッチ(0:消去 1:表示) | |Putsprite(n,x,y,c,s) |n:スプライト面 x,y:座標 c:カラー(Bit7を立てると左シフト) | | |s:スプライト番号 | |Paint(x,y,c,i) |x,y:開始座標 c:カラー i:境界色 | |Pset(x,y,c) |x,y:座標 c:カラー | |Preset(x,y) |x,y:座標 | |Screen(m,s,k) |m:モード s:スプライトサイズ k:キークリックスィッチ | |Sprite(n,d0…d7/d15) |n:スプライト番号 d1〜d15:定義データ | |Vpoke(ah,al,d) |ah,al:アドレス d:データ | |Key(n) |n:ファンクションキー表示(n=0で消去) | |Sound(n,m) |n:PSGレジスタ番号 m:データ | |Width(n) |n:1行文字数 | |―――――――――――+―――――――――――――――――――――――――| |::::関::::::::::数::::|::::::::::::::::機::::::::::::::::能::::::::::::::| |―――――――――――+―――――――――――――――――――――――――| |Point'x,y) |x,y:座標(指定した座標のカラーコードを返す) | |Vpeek(ah,al) |ah,al:アドレス(VRAMデータを返す) | |Stick(n) |n:ジョイスティック番号 | |String(n) |n:ジョイスティック番号 | |Time |内部時計変数の下位バイトを返す | |Keyport(n) |nで指定したキーマトリクスのROWの状態を返す | |pdl(n) |nで指定されたパドルの状態を返す | |pad(n) |nで指定されたパッドの状態を返す | |Romos(ah,al,a,h,l,d,e,|ah,alで指定したアドレスをそれ以下で指定したレジスタデータ | |b,c,ixh,ixl,iyh,iyl) |データを持ってコールする。リターン時のAccの値を返す。 | | |レジスタは省略可能。文としても使用可能 | ・―――――――――――――――――――――――――――――――――――――・ 表5 入出力装置 ・――――――――――――――――――――・ |::::|::装置番号::|::::装::::::::置::::| |――+――――――+――――――――――| |  |  0   |  キーボード   | |入力|――――――+――――――――――| |  |  ――  |  ―――――   | |――+――――――+――――――――――| |  |  0   |   CRT    | |  |――――――+――――――――――| |  |  1   |  プリンタ    | |出力|――――――+――――――――――| |  |  2   | グラフィック画面 | |  |――――――+――――――――――| |  |  3   | BGM(本文参照)| |  |――――――+――――――――――| |  |  ――  |  ―――――   | ・――――――――――――――――――――・ ■■■■■■■■■■■■■■■■■■■       ここらで一息 ■■■■■■■■■■■■■■■■■■■ 以上TL/Xについて駆け足で解説しましたが、 だいたいの使い方が理解していただけたかと思います。 解かりにくかった点も多いかと思いますが、 実際に使っていただければそれほど難しいものではないと思います。 次回はライブラリ機能の拡張の方法を始めとする、より高度な使い方、 使用しているROMOSの解説等、 TL/Xを骨の髄までしゃぶるための情報をお届けする予定です。